//
// Created on 2025/8/24.
//


#include "md_nativeimage_ref.h"
#include "../md_log.h"
#include "../md_defines.h"
#include <GLES3/gl3.h>
#include <GLES2/gl2ext.h>
#include <cstring>

namespace asha {
namespace vrlib {

MDNativeImageRef::MDNativeImageRef(int texture_id) {
    texture_id_ = texture_id;
    oh_image_ = OH_NativeImage_Create(texture_id, GL_TEXTURE_EXTERNAL_OES);
    if (oh_image_) {
        OH_NativeImage_GetSurfaceId(oh_image_, &surface_id_);
    }
}

MDNativeImageRef::~MDNativeImageRef() {
    if (oh_image_) {
        OH_NativeImage_Destroy(&oh_image_);
    }
}

// 设置单位矩阵的辅助函数
static void SetIdentityMatrix(float* matrix) {
    if (!matrix) return;
    matrix[0] = 1.0f; matrix[1] = 0.0f; matrix[2] = 0.0f; matrix[3] = 0.0f;
    matrix[4] = 0.0f; matrix[5] = 1.0f; matrix[6] = 0.0f; matrix[7] = 0.0f;
    matrix[8] = 0.0f; matrix[9] = 0.0f; matrix[10] = 1.0f; matrix[11] = 0.0f;
    matrix[12] = 0.0f; matrix[13] = 0.0f; matrix[14] = 0.0f; matrix[15] = 1.0f;
}

// 静态变量用于跟踪错误计数
static int g_update_surface_error_count = 0;

int MDNativeImageRef::UpdateSurface(float* matrix) {
    if (!matrix) {
        MD_LOGE("MDNativeImageRef::UpdateSurface matrix is null");
        return MD_ERR;
    }
    
    // 如果没有有效的 NativeImage，使用单位矩阵
    if (!oh_image_) {
        SetIdentityMatrix(matrix);
        return MD_ERR;
    }
    
    // 更新 Surface 图像
    // 注意：需要确保有视频源连接到这个 surface，否则可能会失败
    int ret = OH_NativeImage_UpdateSurfaceImage(oh_image_);
    if (ret != 0) {
        // 如果更新失败（可能还没有视频源），使用单位矩阵
        // 错误码 40601000 表示 Surface 还没有连接到视频源，这是正常的初始状态
        // 只在第一次失败时记录日志，避免日志刷屏
        if (g_update_surface_error_count == 0) {
            MD_LOGW("MDNativeImageRef::UpdateSurface UpdateSurfaceImage failed: %d (Surface not connected yet, this is normal during initialization)", ret);
        }
        g_update_surface_error_count++;
        // 每 60 帧（约 1 秒）记录一次警告，避免日志过多
        if (g_update_surface_error_count % 60 == 0) {
            MD_LOGW("MDNativeImageRef::UpdateSurface still waiting for video source connection (error count: %d)", g_update_surface_error_count);
        }
        SetIdentityMatrix(matrix);
        return MD_ERR;
    }
    
    // 如果成功，重置错误计数
    if (g_update_surface_error_count > 0) {
        MD_LOGI("MDNativeImageRef::UpdateSurface connected successfully after %d attempts", g_update_surface_error_count);
        g_update_surface_error_count = 0;
    }
    
    // 获取变换矩阵
    ret = OH_NativeImage_GetTransformMatrix(oh_image_, matrix);
    if (ret != 0) {
        // 如果获取失败，使用单位矩阵
        MD_LOGE("MDNativeImageRef::UpdateSurface GetTransformMatrix failed: %d, using identity matrix", ret);
        SetIdentityMatrix(matrix);
        return MD_ERR;
    }
    
    return MD_OK;
}

int MDNativeImageRef::GetTextureId() {
    return texture_id_;
}

uint64_t MDNativeImageRef::GetSurfaceId() {
    return surface_id_;
}

bool MDNativeImageRef::IsValid() {
    return oh_image_ != nullptr;
}

}
}


